#ifndef QLSAVWIDGET_H
#define QLSAVWIDGET_H

#include <QWidget>
#include <QSlider>
#include <QLabel>
#include <QTimer>
#include <QPushButton>
#include <QPropertyAnimation>
#include <QGraphicsOpacityEffect>

#include <av_player/qls_av_player.h>

#include "qls_av_widget_global.h"
#include "qls_volume_tool_tip_widget.h"

namespace Ui {
class QLsAVWidget;
}

class QLS_AV_WIDGET_EXPORT QLsAVWidget : public QWidget
{
    Q_OBJECT

public:
    enum PlayerOrder
    {
        PlayerOrder_SingleCycle, /* 单循环 */
        PlayerOrder_OrderCycle,  /* 顺序循环 */
        PlayerOrder_Nor          /* 不循环 */
    };

public:
    explicit QLsAVWidget(QWidget *parent = nullptr);
    ~QLsAVWidget();

    /* 路径 */
    QString AVUrl() const;
    void setAVUrl(const QString &AVUrl);

    /* 播放顺序 */
    PlayerOrder playerOrder() const;
    void setPlayerOrder(const PlayerOrder &playerOrder);

protected:
    QImage m_showImage; /* 记录当前的图像 */

    /* 绘图事件重载 */
    void paintEvent(QPaintEvent *);
    /* 事件过滤器 */
    bool eventFilter(QObject *watched, QEvent *event);
    /* 拖拽事件重载 - 鼠标松开时执行 */
    void dropEvent(QDropEvent *event);
    /* 拖拽事件重载 - 拖拽进来时执行 */
    void dragEnterEvent(QDragEnterEvent *event);

private:
    /* Sec转hh:mm:ss */
    QString SecToTimeStr(qint64 sec);
    /* 音量同步显示 */
    void ShowVolumeToolTip(int volume);
    /* 界面初始化 */
    void HomeInit();

private slots:
    /* 静音 */
    void on_volumeBtn_clicked();
    /* 播放/暂停 */
    void on_playBtn_clicked();
    /* 获取一帧图像 的槽函数 */
    void slotGetOneFrame(QImage img);
    /* 视频总时长变化 的槽函数 */
    void slotTotalTimeChange(qint64 uSec);
    /* 当前时间变化 的槽函数 */
    void slotCurTimeChange(int sec);
    /* 状态变化 的信号 */
    void slotStatusChange(QLsAVPlayer::QLsPlayerStatus status);
    /* 全屏 */
    void on_fullBtn_clicked();
    /* 打开本地视频 */
    void on_openBtn_clicked();
    /* 音量变化 [0, 1] */
    void slotVolumeChange(float volume);
    /* 显示/隐藏 侧边栏 */
    void slotShowSidebarBtnClicked();
    /* 单击事件 的槽函数 */
    void slotClicked();

private:
    Ui::QLsAVWidget *ui;
    QLsAVPlayer *m_avPlayer;

    PlayerOrder m_playerOrder; /* 播放顺序 */

    /* ui->showWidget */
    bool m_bPress;
    bool m_bMove;
    bool m_bFull;                          /* 全屏 */
    QPushButton *m_showSidebarBtn;         /* 显示侧边栏 */
    QTimer *m_clickedTimer;                /* 单双击冲突定时器 */
    Qt::MouseButtons m_clickedMouseButton; /* 单击按钮事件类型 */
    bool m_bKeyPress;

    /* 进度条 */
    QTimer *m_curTimeTimer;

    /* 音量 */
    QLsVolumeToolTipWidget *m_volumeToolTipWidget;
    QLabel *m_volumeLabel;
    QTimer *m_volumeLabelTimer;

    /* ui->controlWidget */
    QTimer *m_controlWidgetTimer;
    QGraphicsOpacityEffect *m_controlWidgetOpacity;
    QPropertyAnimation
        *m_controlWidgetAnimation; /* 控制底部控制控件的出现和隐藏 */

    /* qss */
    QString m_qssPlay; /* 播放 */
    QString m_qssPlayHover;
    QString m_qssPause; /* 暂停 */
    QString m_qssPauseHover;
    QString m_qssVolume; /* 音量 */
    QString m_qssVolumeHover;
    QString m_qssMute; /* 静音 */
    QString m_qssMuteHover;
    QString m_qssFullExpand; /* 全屏-展开 */
    QString m_qssFullExpandHover;
    QString m_qssFullShrink; /* 全屏-收缩 */
    QString m_qssFullShrinkHover;
    QString m_qssSidebarRight; /* 侧边栏-右-收缩 */
    QString m_qssSidebarRightHover;
    QString m_qssSidebarLeft; /* 侧边栏-左-展开 */
    QString m_qssSidebarLeftHover;

    QString m_playBtnQss_play; /* 播放按钮qss样式 */
    QString m_playBtnQss_pause;
    QString m_volumeBtnQss_volume; /* 静音按钮qss样式 */
    QString m_volumeBtnQss_mute;
    QString m_fullBtnQss_full; /* 全屏按钮 */
    QString m_fullBtnQss_normal;
    QString m_showSidebarBtnQss_right; /* 显示侧边栏按钮 */
    QString m_showSidebarBtnQss_left;
};

#endif // QLSAVWIDGET_H
